docs: add 2B KRW sale readiness roadmap#61
Conversation
There was a problem hiding this comment.
Pull request overview
Adds new documentation to guide “sale readiness” work for kaefa, focusing on productization planning and upfront license/IP diligence posture to support buyer due diligence.
Changes:
- Added a detailed execution roadmap for “sale readiness” work (license posture, CI gates, benchmarks, UI boundary, deployment, revenue evidence, diligence bundle).
- Added a standalone license/IP diligence note describing current license metadata risk and a conservative commercial posture pending owner/legal review.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| docs/superpowers/plans/2026-07-02-kaefa-20b-sale-readiness.md | New sale-readiness execution plan/roadmap covering productization tasks and sequencing. |
| docs/diligence/license-and-ip.md | New diligence note documenting current license-file mismatch risk and dependency/license constraints. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
OpenCode Review Overview
Changed-File Evidence Mapflowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Changed file (10 files)"]
S1 --> I1["repository behavior"]
I1 --> R1["Review risk: Changed file (10 files)"]
R1 --> V1["required checks"]
Evidence --> S2["Workflow: test-fast.yaml"]
S2 --> I2["GitHub Actions review job"]
I2 --> R2["Review risk: Workflow: test-fast.yaml"]
R2 --> V2["actionlint plus required checks"]
Evidence --> S3["Docs (9 files)"]
S3 --> I3["operator or user guidance"]
I3 --> R3["Review risk: Docs (9 files)"]
R3 --> V3["docs review"]
Evidence --> S4["Test (4 files)"]
S4 --> I4["regression suite"]
I4 --> R4["Review risk: Test (4 files)"]
R4 --> V4["targeted test run"]
|
|
CI gate follow-up (2026-07-02 20:58Z) Required
Live status now: PR head is |
|
Core API contract update pushed.
|
|
Fast gate API-contract update pushed.
|
|
Review-followup update pushed.
|
|
Additional review follow-up pushed.
|
| runs-on: ubuntu-latest | ||
|
|
||
| steps: | ||
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 31 out of 31 changed files in this pull request and generated 4 comments.
Comments suppressed due to low confidence (1)
tests/testthat/test-shiny-product-surface.R:1
testthat::fail()records a failure but does not abort the test; returningNULLhere can lead to a hard error later (e.g.,readLines(app_path)withNULL). Prefertestthat::skip()(if it's acceptable to skip when missing) orstop()(if missing is truly fatal), or make callers explicitly guard onNULL/NAbefore reading the file.
| return(invisible(NULL)) | ||
| } | ||
|
|
||
| manifest <- read.csv(manifest_path, stringsAsFactors = FALSE) |
| expect_true(all(manifest$rows > 0)) | ||
| expect_true(all(manifest$items > 0)) | ||
| expect_true(all(manifest$expected_factor_min >= 1)) | ||
| expect_true(all(manifest$expected_factor_min <= manifest$items)) | ||
| expect_true(all(manifest$expected_factor_max >= manifest$expected_factor_min)) | ||
| expect_true(all(manifest$expected_factor_max <= manifest$items)) | ||
| expect_true(all(manifest$expected_runtime_seconds > 0)) |
|
|
||
| COPY DESCRIPTION /opt/kaefa/DESCRIPTION | ||
|
|
||
| RUN Rscript -e 'install.packages("remotes", repos = Sys.getenv("R_REPOS")); remotes::install_deps(dependencies = c("Depends", "Imports", "LinkingTo"), repos = Sys.getenv("R_REPOS"), upgrade = "never")' |
|
|
||
| EXPOSE 3838 | ||
|
|
||
| CMD ["Rscript", "-e", "kaefa::launchAEFA(host = '0.0.0.0', port = 3838)"] |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 31 out of 31 changed files in this pull request and generated 2 comments.
Comments suppressed due to low confidence (2)
tests/testthat/test-shiny-product-surface.R:1
- These assertions depend on raw string matching against
inst/shiny-app/app.R, including a hard-coded expectation that a specific assignment occurs exactly once. This is brittle (minor formatting/refactor changes will break the test without a behavior change). Prefer asserting behavior via unit tests of the helper functions (already done for invalid columns/metadata) and, for server logic, considershiny::testServer()/module-level tests or extracting state-reset logic into a helper that’s tested directly.
tests/testthat/test-shiny-product-surface.R:1 - These assertions depend on raw string matching against
inst/shiny-app/app.R, including a hard-coded expectation that a specific assignment occurs exactly once. This is brittle (minor formatting/refactor changes will break the test without a behavior change). Prefer asserting behavior via unit tests of the helper functions (already done for invalid columns/metadata) and, for server logic, considershiny::testServer()/module-level tests or extracting state-reset logic into a helper that’s tested directly.
| @@ -0,0 +1,28 @@ | |||
| FROM r-base:4.4.2 | |||
|
|
||
| COPY DESCRIPTION /opt/kaefa/DESCRIPTION | ||
|
|
||
| RUN Rscript -e 'install.packages("remotes", repos = Sys.getenv("R_REPOS")); remotes::install_deps(dependencies = c("Depends", "Imports", "LinkingTo"), repos = Sys.getenv("R_REPOS"), upgrade = "never")' |
| FROM r-base:4.4.2 | ||
|
|
||
| ENV R_REPOS=https://cloud.r-project.org |
|
|
||
| COPY DESCRIPTION /opt/kaefa/DESCRIPTION | ||
|
|
||
| RUN Rscript -e 'install.packages("remotes", repos = Sys.getenv("R_REPOS")); remotes::install_deps(dependencies = c("Depends", "Imports", "LinkingTo"), repos = Sys.getenv("R_REPOS"), upgrade = "never")' |
| repo_file <- function(...) { | ||
| repo_paths <- c( | ||
| file.path(...), | ||
| file.path("..", "..", ...) | ||
| ) | ||
| repo_path <- repo_paths[file.exists(repo_paths)][1] | ||
|
|
||
| if (is.na(repo_path) || !nzchar(repo_path)) { | ||
| testthat::skip(paste("repository file not found:", file.path(...))) | ||
| } | ||
|
|
||
| repo_path | ||
| } |
Summary
kaefakaefa-core,kaefa-studio, andkaefa-runnerboundaries instead of introducing a submodule nowkaefa-corepilot-facing API contract and exported-helper cleanup policyLICENSEwith GPL-3 text and document license/IP diligence risk, runtime dependency licenses, and working commercial posturetest-fastGitHub Actions gate for manifest, Shiny product-surface, and core API contracts.dockerignore, ShinyProxy example, and deployment guidekaefa 2B KRW Productization Architectureflow and align data-room wording with runtime-code container evidenceValidation
f44d0aa6f922303abafc9f5da152c33ec0b8c63ff44d0aa:npx -y markdownlint-cli2@0.20.0 docs/diligence/contextualwisdomlab-resource-map.mdgit diff --checkrg -n 'Current head audited|Current evidence:|current-head image must be rebuilt|smoke tested again|taking too long|rerun to completion|rebuild needs rerun|smoke evidence must be rerun|Container rebuild needs rerun|Current-head smoke needs rerun' docsreturned no matchesgit diff --name-only b5bfdb8b509eb8ec06f143c6435f880eda3d2e20..HEADshows only docs/test files changed after the runtime-code smoke commit; noDockerfile,DESCRIPTION,R/, orinst/shiny-app/runtime files changed in that rangepodman build -t kaefa-studio:local .completed with exit code 0 and produced image47f328553868podman run --rm -d --name kaefa-studio-smoke -p 127.0.0.1:3838:3838 kaefa-studio:localcurl http://127.0.0.1:3838/returned HTTP 200, 12,017 bytes, and titlekaefa: Automated Exploratory Factor AnalysisListening on http://0.0.0.0:3838R CMD INSTALL .Rscript - <<'RSCRIPT'withStopReporterfortest-benchmark-manifest.R,test-shiny-product-surface.R, andtest-core-api-contract.RRscript -e 'testthat::test_file("tests/testthat/test-benchmark-manifest.R")'Rscript -e 'testthat::test_file("tests/testthat/test-shiny-product-surface.R")'ruby -e 'require "yaml"; YAML.load_file("deploy/shinyproxy/application.yml.example"); puts "shinyproxy yaml ok"'Rscript -e 'read.csv("inst/benchmarks/manifest.csv", stringsAsFactors = FALSE); cat("manifest csv ok\n")'Notes
shiny,DT, andfitdistrplusare inImports, and the runtime-code container smoke confirmskaefa::launchAEFA()starts successfully in the image.actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83ddwas checked against the officialactions/checkouttags and corresponds tov6.0.2.f44d0aa6f922303abafc9f5da152c33ec0b8c63f; base branch policy prohibits it, and repository auto-merge is disabled (enablePullRequestAutoMerge).